perm filename NTBOX.OLD[CMS,LCS]1 blob sn#393228 filedate 1978-11-07 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00013 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE TBOX
C00004 00003	   Reset and interrupt vectors.
C00006 00004	INPUT WAIT
C00009 00005	FIXCMD:	MOVRA	CMD	Fix for no clobber CMD?
C00011 00006	   Put SUBOFF after CKACT?
C00013 00007	RSTRAM:	SRB0	Select ram bank 0.
C00015 00008	 Byte input routine
C00017 00009	Alfa led output routines.
C00018 00010	 Bit spreading table
C00020 00011		MOVRI	K,JSW
C00022 00012	Alfa led message table.
C00025 00013	0 ↔ 0 ↔ 0 ↔ 0
C00028 ENDMK
C⊗;
	TITLE TBOX
	.INSERT MAC748.FAI[CMS,LCS]

   ;Ram bank 0 registers.
	K ← 0
	I ← 1
	N ← 2
	T ← 3	;Timer overflow count.
	CMD ← 4	;TBOX and JS led bits.
	CMD1 ← 5	;Alfa led message index.
	OFFL ← 6	;Alfa off timer low.
	OFFH ← 7	;High.

   ;Ram10-27 = Stack.
   ;Ram bank 1 registers.
	P ← 30	;Pots pointer.
	O ← 31	;Offset pointer.
	X ← 32
	Y ← 33
	Z ← 34
	SW0 ← 35	;TBOX switch bits.
	SW1 ← 36
	SW2 ← 37

   ;Standard ram.
	SPD ← 40	;Speed pot.
	P0 ← 41	;Joy stick pots.
	P1 ← 42
	P2 ← 43
	P3 ← 44
	JSW ← 45	;Joy stick switch bits.

	OSPD ← 46	;Old speed pot.
	OP0 ← 47	;Joy stick offsets.
	OP1 ← 50
	OP2 ← 51
	OP3 ← 52
	OJSW ← 53	;Old joy stick switch bits.
	OCMD ← 54	;Old led bits.
	OCMD1 ← 55	;Old alfa led index.

	JSC ← 56	;Joy stick not calib. flag.

	XTAL ← =6000000	;In hertz.
	BRATE ← =9600	;Baud rate

TBIT ← ((=10000000/BRATE)/((=10000000/XTAL)*=15))/2

	TT ← 1	;Triple throw switch port.
	S ← 2	;Scan and A/D port.
	PBL ← 4	;Push button port low.
	PBH ← 5	;Push button port high.
	CEW ← 6	;Alfa led chip enables and write port.
	JS ← 7	;Joy stick, CU, and led latch port.
   ;Reset and interrupt vectors.
	JMP	RST	;RESET VECTOR
	0
	DISXI		;EXTERNAL INTERRUPT VECTOR
	NOP
	NOP
	NOP
	DISTI		;TIMER INT VECTOR
	RETR

   ;Power on reset.
RST:	MOVI	377	;SETUP INPUT PORTS
	OUTB	;Latch bus output.
	OUTP	TT	;SPTT switches.
	MOVI	77	;P4-7 and SCAN.
	OUTP	S

	MOVAX	PBL	;PBSW low.
	MOVAX	PBH	;PBSW high.

   ;Clear cursor memory.
	MOVI	70	;7/2,,10.
	MOVAX	CEW	;Enable all alfa leds.
	ROL	;A ← 160.
	MOVAX	JS	;Clear JS and CU.

	SWAP	;A ← 7.
	ANPA	CEW	;NOT W
	CPLA
	ORPA	CEW	;W

	MOVI	217	;10,,17.
	ORPA	CEW	;Disable all alfa leds.

	SWAP	;A0-3 ← 10.
	ORPA	JS	;NOT CU.

	CALL	CLED	;Clear leds
	MOVAT		;Setup timer?
	STRTT

	CLRF1	;Set alfa leds on.
	MOVRI	OFFL,1	;Setup alfa off timer.
	MOVRI	OFFH,1

	JMP	SETFLG

; Set scan flag and timer
UPFLG:	DJNZ	T,CKIN
SETFLG:	MOVRI	T,3	;4 = 96 ms?
	CLRF0		;Set scan flag

	JF1S	CKIN	;Check if alfa off.
	DJNZ	OFFL,CKIN	;OFFW ← OFFW - 1.
	DJNZ	OFFH,CKIN
	CPLF1	;Set alfa led off flag.
   ;Put alfa clear in pscan?
	CALL	CALED	;Clear alfa leds.
;INPUT WAIT
   OFFSET ← TBIT/2	;Center delay.
ZERA:	CLRA	;Clear A for input byte.
INWAI:	JTF	UPFLG	;Check if timer time out.

CKIN:	JT0H	INWAI	;Check for start bit.

	MOVRI	K,OFFSET-4	;Center - Itime.
CENTER:	DJNZ	K,CENTER	;Wait for center of bit
	JT0H	INWAI	;Check if valid start bit

	MOVRI	N,11	;# of bits -1
ILOOP:	CALL	IWAI	;Add iwai here?
	DJNZ	N,ILOOP

	ROLC		;Shift out stop bit
	JCC	ZERA	;Check for good stop bit.

	JBS	7,BYTE1	;Check if first or second byte.

	MOVAR	CMD	;Save first input byte.
	JMP	ZERA	;Get next byte.

BYTE1:	MOVAR	CMD1	;Save second byte.
	MOVRI	K,OCMD1	;Check if different than old.
	XORM	K
	JZ	GSPD
	MOVRA	CMD1
	SWAP	;Shift etc.
	ROR
	CALL	OALFA

GSPD:	CLRA	;SPD default.
	JT1H	ADZRO	;Speed off.

   ;A/DCHAN ← SPEED.
	CLRA
	OUTB	;Latch zero on bus.
	ORPI	S,200	;ALE.
	ANPI	S,177	;NOT ALE.

	CALL	CONVRT	;Wait for speed.

	JNZ	ADZRO	;Check if on and zero.
	INCA	;A ← 1.

ADZRO:	MOVRI	K,SPD	;Save speed pot value.
	MOVAM	K

	CALL	CLED	;Clear cal. and mode leds.
	MOVRA	CMD	;Get mode code.
	RORC	;Get cal. bit.
	ANI	7	;Flush JS led bits.
	CALL	WLED	;Write mode led.

	JCC	FIXCMD	;No calib. bit.
	CLRA	;Led 0.
	CALL	WLED	;Write cal. led.
FIXCMD:	MOVRA	CMD	;Fix for no clobber CMD?
	SWAP	;Get JS led bits.
	ANI	3	;2 JS led bits.
	MOVRI	K,JSC
	ORM	K	;A ← A .OR. JSC.
	INCA	;Fix for latch.
	MOVAR	CMD
;A/D convert routines.

	JINT	GPOTS	;Check for joy stick.
   ;RAM(JSW) ← 0. Zero joy stick switches.
   ;JSC ← 0.
	JMP	CKSCAN

GPOTS:	MOVRA	CMD
	MOVAR	I	;Save JS led bits.
	MOVI	1	;Chanel 1.
	OUTB	;Latch bus output.
	ORPI	S,200	;ALE
	ANPI	S,177	;NOT ALE.

	MOVI	2	;CLR bit.
	ORPA	JS	;CLR.
	CPLA
	ANPA	JS	;NOT CLR.
	MOVRI	P,P0	;JS pot index.
	MOVRI	N,5	;# of pots + switch channel.

ADLOOP:	CALL	CONVRT	;Wait for A/D.
	MOVAM	P	;Ram(p) ← Pot(p).

	DJNZ	I,CNTIT	;Check if JS led.
	MOVI	373	;NOT JS led latch bit.
	ANPA	JS	;NOT LAT.
	CPLA
	ORPA	JS	;LAT.

CNTIT:	MOVI	1
	ORPA	JS	;CNT
	CPLA
	ANPA	JS	;NOT CNT.

	INCR	P	;Next pot.
	DJNZ	N,ADLOOP	;Next channel.

;Check for scan flag.
CKSCAN:	JF0S	CKJSC	;Scan flag.

	JMP	SCAN	;Scan switches.

CKJSC:	SRB1	;Select ram bank 1.
	MOVRI	K,JSC
	MOVMA	K	;A ← JSC.
	JBS	2,SUBOFF;Check if joy stick calib.

ZPOTS:	CLRA
	MOVAR	P0	;Ram(Pots) ← 0.
	MOVAR	P1
	MOVAR	P2
	MOVAR	P3
	JMP	CKACT
   ;Put SUBOFF after CKACT?
SUBOFF:	MOVRI	P,P0	;Pots pointer.
	MOVRI	O,OP0	;Offset pointer.
	MOVRI	N,4	;# of pots.

OFFSL:	MOVMA	P	;Get pot.
	CPLA
	ADDM	O	;Subtract offset.
	CPLA
	MOVAM	P	;Save pot.

	INCR	P
	INCR	O
	DJNZ	N,OFFSL

;Activity check.
CKACT:	SRB0	;Select ram bank 0.

	MOVRI	K,OCMD
	MOVMA	K
	XORR	CMD	;A ← CMD .XOR. OCMD.
	JNZ	ACTIVE

	MOVRI	K,OCMD1	;Old alfa index.
	MOVMA	K
	XORR	CMD1
	JNZ	ACTIVE

	SRB1	;Select ram bank 1.
	MOVRA	SW0
	JNZ	RSTRAM

	MOVRA	SW1
	JNZ	RSTRAM

	MOVRA	SW2
	ANI	77	;Mask out JS and P/O bits.
	JNZ	RSTRAM

   ;Check if JS zero, not old?
	MOVRI	P,SPD	;Now pot index.
	MOVRI	O,OSPD	;Old pot index.
	MOVRI	N,6	;# of pots + JSW.

POTCK:	MOVMA	P	;A ← RAM(NOW).
	XORM	O	;A ← A .XOR. RAM(OLD).
	JNZ	RSTRAM	;Active.

	INCR	P	;Next pot.
	INCR	O
	DJNZ	N,POTCK

	JMP	OBITS	;Not active.
RSTRAM:	SRB0	;Select ram bank 0.
   ;Don't save JS pots?
ACTIVE:	MOVRA	CMD	;OLD ← NEW.
	MOVRI	K,OCMD
	MOVAM	K	;OCMD.
	MOVRA	CMD1
	INCR	K
	MOVAM	K	;OCMD1.

	MOVRI	P,SPD
	MOVRI	O,OSPD
	MOVRI	N,5

   ;Not save JS pots?
SAVL:	MOVMA	P	;A ← Ram(new).
	MOVAM	O	;Ram(old) ← A.
	INCR	P
	INCR	O
	DJNZ	N,SAVL

	CLRF1	;Alfa led off flag ← -1.
	MOVRI	OFFH,10	;OFFW ← tOWAIT.

OBITS:	SRB1	;Select ram bank 1?
	MOVRI	I,SW0	;Point to out bytes.
	MOVRI	CMD,10	;# of output bytes.

OUTL:	MOVMA	I	;Get output byte.
	CALL	OBYTE	;Put obyte here?
	INCR	I
	DJNZ	CMD,OUTL

	SRB0	;Select ram bank 0.
	JMP	ZERA	;Loop back to input wait.
; Byte input routine
	IWAI:	MOVRI	N,TBIT-6
	WAI:	DJNZ	N,WAI
		CLRC
		JT0H	BITON
		NOP
		RORC
		RET

	BITON:	CPLC
		RORC
		RET

WLED:	OUTB	;Latch A on bus.
	MOVI	7	;NOT led E bit.
	ANPA	JS	;NOT E.
	CPLA
	ORPA	JS	;E.

	RET

;Clear leds
CLED:	MOVRI	N,370
	MOVRA	N	;Setup regs.
CLRL:	CALL	WLED	;Clear led loop.
	INCR	N	;Next led.
	MOVRA	N
	JNZ	CLRL

	RET

; Output Acc. to SI/O line
OBYTE:	MOVRI	K,11	;# of bits -1
	CLRC
	ROLC		;Start bit
OLOOP:	OUTP	TT	;Output bit
	RORC
	MOVRI	N,TBIT-3	;TBIT - Itime.

OWAIT:	DJNZ	N,OWAIT
	DJNZ	K,OLOOP

	ORPI	TT,377	;Stop bit.

	MOVRI	N,TBIT-7	;TBIT - Itime.
SWAIT:	DJNZ	N,SWAIT
	NOP
	RET

;Convert channel and wait.
CONVRT:	ORPI	S,100	;STRT.
	ANPI	S,277	;NOT STRT.
	MOVI	=15	;?
CONL:	DECA	;Convert wait.
	JNZ	CONL
	INB	;Read A/D twice for bus unlatch.
	INB
	RET
;Alfa led output routines.
CALED:	MOVI	4	;Blank string index.

OALFA:	MOVAR	I	;Save string index.
	MOVI	376	;NOT CE0.

CENBL:	MOVRI	N,4	;# of chrs in I.C.
	MOVAR	K	;Save CE.
	MOVAX	CEW	;NOT CE.

CHRL:	MOVRA	I
	MOVP3	;A ← String(chr).
	OUTB	;Latch bus output.

	MOVI	367
	ANPA	CEW	;NOT W.
	CPLA
	ORPA	CEW	;W

	INCR	I	;CHR ← CHR+1.
	DJNZ	N,CHRL

	MOVRA	K
	ROL	;Next CE.
	JBS	3,CENBL

	ORPA	CEW	;CE.

	RET
; Bit spreading table
	LOC 1274	;1274 = Start of page two.
	  0 ↔   1 ↔   4 ↔   5 ↔  20 ↔  21 ↔  24 ↔  25
	100 ↔ 101 ↔ 104 ↔ 105 ↔ 120 ↔ 121 ↔ 124 ↔ 125

	SBITS ← 60	;Scan bits.
	ROW0 ← 357	;Scan row 0.
	ROW1 ← 337	;Scan row 1.

SCAN:	SRB1	;Select ram bank 1.
	CPLF0		;Reset scan flag.
	ORPI	S,SBITS	;Turn off rows
	ANPI	S,ROW0	;Enable row 0.
	INP	TT	;Scan row 0
	CPLA
	MOVAR	SW0	;Save it
	ANI	17	;Get low nibble
	MOVPD		;Get bits from spread table
	XCHR	SW0
	SWAP		;Swap high low nibbles
	ANI	17	;Get high nibble 
	MOVPD
	MOVAR	SW1

	ORPI	S,SBITS	;Turn off row 0.
	ANPI	S,ROW1	;Enable row 1.
	INP	TT	;Scan row 1
	ORPI	S,SBITS	;Disable scan.
	CPLA
	MOVAR	SW2	;Save row 1
	ANI	17	;Low nibble
	MOVPD
	ROL		;Shift + bits
	ORR	SW0	;Or into - bits
	ANI	374	;Clear teach and off bits.
	MOVAR	SW0
	MOVRA	SW2	;Get row 1 again
	SWAP
	ANI	17
	MOVPD
	ROL
	ORR	SW1
	MOVAR	SW1

	MOVXA	PBL	;Get push buttons.
	MOVAR	SW2	;Save low nibble.
	MOVXA	PBH
	SWAP	;High nibble.
	ORR	SW2

	CPLA
	MOVAR	SW2
	ANI	77	;Zero JS and P/O bits.
	XCHR	SW2
	ROLC		;Shift & swap teach & off bits
	ROL
	ROLC
	ANI	3
	ORR	SW0
	MOVAR	SW0
	MOVRI	K,JSW
	MOVMA	K	;A ← JSW.
	ORR	SW2
	MOVAR	SW2	;SW2 ← JSW .OR. PBSWs.

	JINT	CKJST	;Check if joy stick.
	JMP	ZPOTS	;No joy stick.

CKJST:	MOVRI	K,JSW	;?
	MOVMA	K	;Joy stick switch bits.
	JBS	6,GTOOL	;Check JS/TBOX bit.

   ;Add P/O bit.
CKJCAL:	JBS	7,SETOFF;Check for joy stick calib.
	JMP	CKJSC

   ;Check JS switch bits?
GTOOL:	ROR	;Get JS teach bit.
	RORC
	ROR	;Shift tool bits.
	ROR
	ANI	300
	XCHR	SW1
	ANI	77
	ORR	SW1	;Or into SW1.
	MOVAR	SW1

	MOVRA	SW0
	ROR	;Flush old teach bit.
	ROLC	;Shift in JS teach bit.
	MOVAR	SW0

	JMP	CKJSC

SETOFF:	SRB1	;Select ram bank 1.
	MOVRI	P,P0	;Pots pointer.
	MOVRI	O,OP0	;Offset pointer.
	MOVRI	N,4	;# of pots.

SETL:	MOVMA	P	;A ← POT(P).
	MOVAM	O	;OFFSET(O) ← A.
	INCR	P
	INCR	O
	DJNZ	N,SETL

	SRB0	;Select ram bank 0.
	MOVRI	K,JSC
	MOVI	377
	MOVAM	K	;JSC ← -1.

	JMP	CKACT
;Alfa led message table.
   LOC 1674	;Start of page three.
0 ↔ 0 ↔ 0 ↔ 0
" "∧77 ↔ (" "∧77)∨100 ↔ (" "∧77)∨200
(" "∧77)∨300 ↔ " "∧77 ↔ (" "∧77)∨100
(" "∧77)∨200 ↔ (" "∧77)∨300 ↔ " "∧77
(" "∧77)∨100 ↔ (" "∧77)∨200 ↔ (" "∧77)∨300

0 ↔ 0 ↔ 0 ↔ 0
"L"∧77 ↔ ("I"∧77)∨100 ↔ ("M"∧77)∨200
("I"∧77)∨300 ↔ "T"∧77 ↔ (" "∧77)∨100
("S"∧77)∨200 ↔ ("T"∧77)∨300 ↔ "O"∧77
("P"∧77)∨100 ↔ (" "∧77)∨200 ↔ ("1"∧77)∨300

0 ↔ 0 ↔ 0 ↔ 0
"L"∧77 ↔ ("I"∧77)∨100 ↔ ("M"∧77)∨200
("I"∧77)∨300 ↔ "T"∧77 ↔ (" "∧77)∨100
("S"∧77)∨200 ↔ ("T"∧77)∨300 ↔ "O"∧77
("P"∧77)∨100 ↔ (" "∧77)∨200 ↔ ("2"∧77)∨300

0 ↔ 0 ↔ 0 ↔ 0
"L"∧77 ↔ ("I"∧77)∨100 ↔ ("M"∧77)∨200
("I"∧77)∨300 ↔ "T"∧77 ↔ (" "∧77)∨100
("S"∧77)∨200 ↔ ("T"∧77)∨300 ↔ "O"∧77
("P"∧77)∨100 ↔ (" "∧77)∨200 ↔ ("3"∧77)∨300

0 ↔ 0 ↔ 0 ↔ 0
"L"∧77 ↔ ("I"∧77)∨100 ↔ ("M"∧77)∨200
("I"∧77)∨300 ↔ "T"∧77 ↔ (" "∧77)∨100
("S"∧77)∨200 ↔ ("T"∧77)∨300 ↔ "O"∧77
("P"∧77)∨100 ↔ (" "∧77)∨200 ↔ ("4"∧77)∨300

0 ↔ 0 ↔ 0 ↔ 0
"L"∧77 ↔ ("I"∧77)∨100 ↔ ("M"∧77)∨200
("I"∧77)∨300 ↔ "T"∧77 ↔ (" "∧77)∨100
("S"∧77)∨200 ↔ ("T"∧77)∨300 ↔ "O"∧77
("P"∧77)∨100 ↔ (" "∧77)∨200 ↔ ("5"∧77)∨300

0 ↔ 0 ↔ 0 ↔ 0
"L"∧77 ↔ ("I"∧77)∨100 ↔ ("M"∧77)∨200
("I"∧77)∨300 ↔ "T"∧77 ↔ (" "∧77)∨100
("S"∧77)∨200 ↔ ("T"∧77)∨300 ↔ "O"∧77
("P"∧77)∨100 ↔ (" "∧77)∨200 ↔ ("6"∧77)∨300

0 ↔ 0 ↔ 0 ↔ 0
"L"∧77 ↔ ("I"∧77)∨100 ↔ ("M"∧77)∨200
("I"∧77)∨300 ↔ "T"∧77 ↔ (" "∧77)∨100
("S"∧77)∨200 ↔ ("T"∧77)∨300 ↔ "O"∧77
("P"∧77)∨100 ↔ (" "∧77)∨200 ↔ ("7"∧77)∨300
0 ↔ 0 ↔ 0 ↔ 0
"T"∧77 ↔ ("O"∧77)∨100 ↔ ("O"∧77)∨200
(" "∧77)∨300 ↔ "C"∧77 ↔ ("L"∧77)∨100
("O"∧77)∨200 ↔ ("S"∧77)∨300 ↔ "E"∧77
(" "∧77)∨100 ↔ (" "∧77)∨200 ↔ (" "∧77)∨300

0 ↔ 0 ↔ 0 ↔ 0
"T"∧77 ↔ ("O"∧77)∨100 ↔ ("O"∧77)∨200
(" "∧77)∨300 ↔ "F"∧77 ↔ ("A"∧77)∨100
("R"∧77)∨200 ↔ (" "∧77)∨300 ↔ " "∧77
(" "∧77)∨100 ↔ (" "∧77)∨200 ↔ (" "∧77)∨300

0 ↔ 0 ↔ 0 ↔ 0
"T"∧77 ↔ ("E"∧77)∨100 ↔ ("A"∧77)∨200
("C"∧77)∨300 ↔ "H"∧77 ↔ (" "∧77)∨100
("M"∧77)∨200 ↔ ("O"∧77)∨300 ↔ "D"∧77
("E"∧77)∨100 ↔ (" "∧77)∨200 ↔ (" "∧77)∨300

0 ↔ 0 ↔ 0 ↔ 0
"M"∧77 ↔ ("A"∧77)∨100 ↔ ("N"∧77)∨200
("U"∧77)∨300 ↔ "A"∧77 ↔ ("L"∧77)∨100
(" "∧77)∨200 ↔ ("M"∧77)∨300 ↔ "O"∧77
("D"∧77)∨100 ↔ ("E"∧77)∨200 ↔ (" "∧77)∨300

0 ↔ 0 ↔ 0 ↔ 0
"N"∧77 ↔ ("O"∧77)∨100 ↔ (" "∧77)∨200
("H"∧77)∨300 ↔ "I"∧77 ↔ ("G"∧77)∨100
("H"∧77)∨200 ↔ (" "∧77)∨300 ↔ "P"∧77
("W"∧77)∨100 ↔ ("R"∧77)∨200 ↔ (" "∧77)∨300

0 ↔ 0 ↔ 0 ↔ 0
"P"∧77 ↔ ("R"∧77)∨100 ↔ ("O"∧77)∨200
("G"∧77)∨300 ↔ " "∧77 ↔ ("R"∧77)∨100
("U"∧77)∨200 ↔ ("N"∧77)∨300 ↔ "N"∧77
("I"∧77)∨100 ↔ ("N"∧77)∨200 ↔ ("G"∧77)∨300

0 ↔ 0 ↔ 0 ↔ 0
"R"∧77 ↔ ("U"∧77)∨100 ↔ ("N"∧77)∨200
(" "∧77)∨300 ↔ "H"∧77 ↔ ("O"∧77)∨100
("L"∧77)∨200 ↔ ("D"∧77)∨300 ↔ " "∧77
(" "∧77)∨100 ↔ (" "∧77)∨200 ↔ (" "∧77)∨300

0 ↔ 0 ↔ 0 ↔ 0
"F"∧77 ↔ ("A"∧77)∨100 ↔ ("T"∧77)∨200
("A"∧77)∨300 ↔ "L"∧77 ↔ (" "∧77)∨100
("E"∧77)∨200 ↔ ("R"∧77)∨300 ↔ "R"∧77
("O"∧77)∨100 ↔ ("R"∧77)∨200 ↔ (" "∧77)∨300

   LOC 2272
	0	;This is for a block of zeros
END